/*************************************************************************
	> File Name: oj-81_xiaomingbackhome.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月20日 星期五 18时10分24秒
 ************************************************************************/

#include <iostream>
#include <queue>
using namespace std;

//需要增加一个f记录有没有买手机
struct node {
    int x, y, step, f;
};

//check 标记数组，用来去重
//0 没来过
//1 没手机的时候来过
//2 有手机的时候来过
//3 在这儿买到手机了
int n, m, check[2005][2005];
char mmap[2005][2005];
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};

int main() {
    cin >> n >> m;
    queue<node> que;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> mmap[i][j];
            if (mmap[i][j] == 'S') {
                //起点放入队列
                que.push((node){i, j, 0, 0});
                //标记没手机的时候来过
                check[i][j] = 1;
            }
        }
    }
    while (!que.empty()) {
        node temp = que.front();
        que.pop();
        for (int i = 0; i < 4; ++i) {
            int x = temp.x + dir[i][0];
            int y = temp.y + dir[i][1];
            //去重
            //没手机的情况
            if ((check[x][y] & 1) && temp.f == 0) {
                //现在没手机，且没手机的时候来过这
                //就不能来了
                continue;
            }
            if ((check[x][y] & 2) && temp.f == 1) {
                //现在有手机，而且有手机的时候来过这
                //不能走了
                continue;
            }
            if (mmap[x][y] == 'T' && temp.f == 1) {
                //到终点且有手机
                cout << temp.step + 1 << endl;
                return 0;
            }
            if (mmap[x][y] == '.' || mmap[x][y] == 'S' || mmap[x][y] == 'T') {
                //是普通的可以走的点，且temp.f为0
                que.push((node){x, y, temp.step + 1, temp.f});
                check[x][y] += temp.f + 1;
            }
            //如果到达了商店
            if (mmap[x][y] == 'P') {
                que.push((node){x, y, temp.step + 1, 1});
                //直接置为3，表示在这买到手机
                check[x][y] = 3;
            }
        }
    }
    //如果程序到这还没带着手机找到终点
    //说明不存在这样的道路
    cout << -1 << endl;
    return 0;
}
